/*
 * Fecha:  07-11-2010
 * @author Paco FELC
 *
    Los puntos totales marcados por el usuario NO son la suma de
    libres*1+campo*2+triples*3 ya que hay tiros especiales que dan más
    puntos

c- casa
v- visitante
jid - identificador de jugador
mi - minutos
pt - puntos totales anotados
t1 - tiro libres
p1 - anotados libres
t2 - tiro campo
p2 - puntos de campo
t3 - triples intentados
p3 - triples anotados
ra - rebotes ataque
rd - rebotes defensa
ra - rebotes ataque
rd - rebotes defensa
as - asistencias
re - recuperaciones/robos
pe - perdidas
ta - tapones hechos
tr - tapones recibidos
fa - faltas
fr - faltas recibidas
va - valoracion
ex - experiencia ganada


id=partido_id|minutos|
     1   2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
&c0=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c1=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c2=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c3=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c4=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c5=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c6=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c7=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c8=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&c9=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex

&v0=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v1=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v2=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v3=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v4=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v5=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v6=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v7=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v8=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex
&v9=jid|mi|pt|t1|p1|t2|p2|t3|p3|ra|rd|as|ro|pe|ta|tr|fa|fr|va|ex

 *
 *
 */

package com.bitoon.basketdudes.ws;
import org.apache.log4j.*;
import com.bitoon.basketdudes.jpa.*;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.StringTokenizer;
import javax.lang.model.element.Element;
import javax.persistence.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom.Document;
import org.jdom.output.XMLOutputter;

/* Mongo y Morphia */
import com.google.code.morphia.Morphia;
import com.google.code.morphia.Datastore;
import com.mongodb.DBObject;
import com.bitoon.basketdudes.mongo.*;

/**
 *
 * @author paco
 */
public class Estadisticas {

    Logger log = Logger.getLogger(DatosEquipo.class);

    EntityManager       em                  = null;
    Partido             m_partido           = null;
    Equipo              m_equipo_c          = null;
    Equipo              m_equipo_v          = null;
    boolean             m_maximo_hoy        = false;

    EstEquipo           m_est_partido_c     = null;
    EstEquipo           m_est_partido_v     = null;
    EstEquipoPartido    m_est_e_partido_c   = null;
    EstEquipoPartido    m_est_e_partido_v   = null;

    int                 m_pve               = -1;

    boolean             mongo = false;

    public Estadisticas( EntityManager p_em) {
        try {
            em = p_em;

            mongo = false;

        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se puedo conectar a la base de datos: " , e);
        }

    }

    public EstEquipoPartido getEstEquipoPartidoCasa()
    {
        return m_est_e_partido_c;
    }
    public EstEquipoPartido getEstEquipoPartidoVisita()
    {
        return m_est_e_partido_v;
    }

    /*
     * Parametros
     *  p_equipo_c: juega en casa
     *  p_equipo_v: juega de visitante
     *  p_exp_c:    experiencia juega en casa
     *  p_exp_v:    experiencia juega visitante
     *  p_abandono: id del equipo que ha abandonado, 0 - nadie
     *
     */
    public void setPartido( Partido p_partido, Equipo p_equipo_c, Equipo p_equipo_v,
                            int p_exp_c, int p_exp_v, int p_abandono ,
                            boolean p_maximo_hoy, int p_pve ) {
log.debug("[DEBUG][Estadisticas][set partido]: " + p_partido.getId() +
        " c: " +p_equipo_c.getId() + " v: " +p_equipo_v.getId());

        m_partido    = p_partido;
        m_equipo_c   = p_equipo_c;
        m_equipo_v   = p_equipo_v;
        m_maximo_hoy = p_maximo_hoy;
        m_pve        = p_pve;

        if ( p_maximo_hoy == true ) {
            p_exp_c = 0;
            p_exp_v = 0;
        }

        if ( p_pve != m_equipo_c.getId() ) {
            /* CASA */
            m_est_partido_c = InicializaEquipo ( m_equipo_c, p_partido.getPuntos1(),(int)p_partido.getPuntos2(),
                    p_partido.getMinutosJugados(), p_exp_c,
                    ( p_partido.getPuntos1()>p_partido.getPuntos2() ? true : false),
                    ( p_abandono == m_equipo_c.getId() ? true : false ), p_pve
                    );

            m_est_e_partido_c = new EstEquipoPartido ();
            EstEquipoPartidoPK pk_c = new EstEquipoPartidoPK ( p_partido.getId(), m_equipo_c.getId());
            m_est_e_partido_c.setEstEquipoPartidoPK(pk_c);
            if ( m_pve == -1)
                em.persist(m_est_e_partido_c);

            InicializaEquipoPartido ( m_est_e_partido_c, (int)p_partido.getPuntos1(),
                        p_partido.getMinutosJugados(), p_exp_c, p_equipo_c.getExperiencia());
        }

        if ( p_pve != m_equipo_v.getId() ) {
            /* VISITANTE */
            m_est_partido_v = InicializaEquipo ( m_equipo_v, p_partido.getPuntos2(),(int)p_partido.getPuntos1(),
                    p_partido.getMinutosJugados(), p_exp_v,
                    ( p_partido.getPuntos1()>p_partido.getPuntos2() ? false : true),
                    ( p_abandono == m_equipo_v.getId() ? true : false ), p_pve
                    );

            m_est_e_partido_v = new EstEquipoPartido ();
            EstEquipoPartidoPK pk_v = new EstEquipoPartidoPK ( p_partido.getId(), m_equipo_v.getId());
            m_est_e_partido_v.setEstEquipoPartidoPK(pk_v);
            if ( m_pve == -1)
                em.persist(m_est_e_partido_v);

            InicializaEquipoPartido ( m_est_e_partido_v, (int)p_partido.getPuntos2(),
                        p_partido.getMinutosJugados(), p_exp_v, p_equipo_v.getExperiencia());
        }
    }

    private EstEquipo InicializaEquipo ( Equipo p_equipo, int p_puntos, int p_puntos_contra, float p_minutos, int p_experiencia,
                                    boolean p_ganador, boolean p_abandono, int p_pve) {

log.debug("[DEBUG][Estadisticas][InicializaEquipo]: " +  p_equipo.getId() + " min:" + p_minutos + 
        " exp:" + p_experiencia + " ganador:" + p_ganador + " abandonador:" + p_abandono );

        EstEquipo est_equipo=null;

        Query q =  em.createNamedQuery("EstEquipo.findByEquipoId");
        q.setParameter("equipoId", p_equipo.getId());

        try {
            est_equipo = (EstEquipo)q.getSingleResult();
        } catch (NoResultException nre) {
            est_equipo = new EstEquipo ();
            est_equipo.setEquipoId( p_equipo.getId() );
            est_equipo.setUsuarioId(p_equipo.getUsuario().getId());
        }

        if ( p_pve == -1 ) {

            est_equipo.setPuntos((est_equipo.getPuntos() + p_puntos));
            est_equipo.setPuntosContra((est_equipo.getPuntosContra() + p_puntos_contra));
            est_equipo.setMinutos((est_equipo.getMinutos() + p_minutos));
//        est_equipo.setExperiencia((est_equipo.getExperiencia() + p_experiencia));

            est_equipo.setPartidos((est_equipo.getPartidos() + 1));
            if ( p_ganador )
                est_equipo.setGanados((est_equipo.getGanados() + 1));
            else
                est_equipo.setPerdidos((est_equipo.getPerdidos() + 1));

            if ( p_abandono )
                est_equipo.setAbandonos((est_equipo.getAbandonos() + 1));
        }
        return est_equipo;
    }

    private void InicializaEquipoPartido ( EstEquipoPartido p_est_e_partido, int p_puntos,
                                           float p_minutos, int p_experiencia, int p_experiencia_ini){

        /* Creamos las estadisticas del equipo para el partido 
        EstEquipoPartido m_est_e_partido = new EstEquipoPartido ();
        EstEquipoPartidoPK pk = new EstEquipoPartidoPK ( p_partido.getId(), p_equipo.getId());
        m_est_e_partido.setEstEquipoPartidoPK(pk); */

        p_est_e_partido.setPuntos( p_puntos);
        p_est_e_partido.setMinutos(p_minutos);
        p_est_e_partido.setExperiencia(p_experiencia);
        p_est_e_partido.setExperienciaIni(p_experiencia_ini);

    }

    public MultiJugador setJugador( boolean p_casa, String p_linea ) throws ExcepcionGeneral {
        int i=0;
        int equipo_id;
        Jugador jugador=null;
        EstJugadorPartido est_j_partido = null;
        EstJugadorEquipo  est_j_equipo  = null;
        EstJugador        est_jugador   = null;
        EstEquipoPartido  est_equipo    = null;
        MultiJugador      multi         = new MultiJugador();

        try {

        if ( p_casa == true ) {
            est_equipo   = m_est_e_partido_c;
            equipo_id    = m_est_e_partido_c.getEstEquipoPartidoPK().getEquipoId();
        } else {
            est_equipo   = m_est_e_partido_v;
            equipo_id    = m_est_e_partido_v.getEstEquipoPartidoPK().getEquipoId();
        }

        StringTokenizer tokens = new StringTokenizer(p_linea,"|");
        while(tokens.hasMoreTokens()){
            i++;
            float float_valor = Integer.parseInt(tokens.nextToken());
            int   valor = (int)float_valor;
            switch (i){
                case 1:
                    int jugador_id = valor;

log.debug("[DEBUG][Estadisticas][setJugador]: " +p_linea );
                    Query q =  em.createNamedQuery("Jugador.findById");
                    q.setParameter("id", jugador_id);
                    try {
                        jugador = (Jugador)q.getSingleResult();
                        multi.jugador=jugador;
                    } catch (NoResultException nre) {
log.debug("[DEBUG][Estadisticas][NO EXISTE EL JUGADOR]: " + jugador_id );
                        throw new ExcepcionGeneral( -2, "Jugador no existe" + jugador_id );
                    }

                    Query q2 =  em.createNamedQuery("EstJugador.findByJugadorId");
                    q2.setParameter("jugadorId", jugador_id);
                    try {
                        est_jugador = (EstJugador)q2.getSingleResult();
                    } catch (NoResultException nre) {
log.debug("[DEBUG][Estadisticas][NO EXISTEN ESTADISTICAS DEL JUGADOR]: " + jugador_id );
                        est_jugador = new EstJugador ();
                        est_jugador.setJugadorId(jugador_id);
                        est_jugador.setPartidos(0);
                        est_jugador.setPuntos(0);

                        multi.est_jugador = est_jugador;
                        if ( m_pve == -1)
                            em.persist(  est_jugador );
                    }

                    Query qe =  em.createNamedQuery("EstJugadorEquipo.findByJugadorIdEquipoId");
                    qe.setParameter("jugadorId", jugador_id);
                    qe.setParameter("equipoId", est_equipo.getEstEquipoPartidoPK().getEquipoId());
                    try {
                        est_j_equipo = (EstJugadorEquipo)qe.getSingleResult();
                    } catch (NoResultException nre) {
log.debug("[DEBUG][Estadisticas][NO EXISTEN ESTADISTICAS DEL JUGADOR_EQUIPO]: " + jugador_id + " eq:" + equipo_id);
                        EstJugadorEquipoPK je_pk = new EstJugadorEquipoPK(equipo_id, jugador_id);
                        est_j_equipo = new EstJugadorEquipo();
                        
                        est_j_equipo = new EstJugadorEquipo ();
                        est_j_equipo.setEstJugadorEquipoPK(je_pk);
                        if ( m_pve == -1)
                            em.persist(  est_j_equipo );
                    }
                    est_j_partido = new EstJugadorPartido();

                    EstJugadorPartidoPK jp_pk = new EstJugadorPartidoPK(m_partido.getId(), jugador_id);
                    est_j_partido.setEstJugadorPartidoPK(jp_pk);
                    est_j_partido.setEquipoId(jugador.getEquipo().getId());
                    break;
                case 2:
                    /* Si no ha jugado al menos un minuto no se contabilizan las estadísticas del jugador */
                    if ( valor == 0) {
log.debug("[DEBUG][Estadisticas][0 minutos]: " + jugador.getId() );
                        return null;
                    }
                    if ( m_pve == -1 ) {
                        est_jugador.setPartidos (est_jugador.getPartidos() +1);
                        est_j_equipo.setPartidos(est_j_equipo.getPartidos()+1);

                        est_jugador.setMinutos  ( est_jugador.getMinutos()  + float_valor/60.0f );
                        est_j_equipo.setMinutos ( est_j_equipo.getMinutos() + float_valor/60.0f );
                        est_j_partido.setMinutos( float_valor/60.0f );

                        multi.est_jugador_partido = est_j_partido;
                        em.persist(  est_j_partido );
                    }
                    break;
                case 3:
                    if ( m_pve == -1 ) {                    
                        est_jugador.setPuntos  ( est_jugador.getPuntos()  + valor );
                        est_j_equipo.setPuntos ( est_j_equipo.getPuntos() + valor );
                        est_j_partido.setPuntos( valor );
                    }
                    break;
                case 4:
                    if ( m_pve == -1 ) {
                        est_jugador.setTiro1  ( est_jugador.getTiro1()  + valor );
                        est_j_equipo.setTiro1 ( est_j_equipo.getTiro1() + valor );
                        est_j_partido.setTiro1( valor );
                        est_equipo.setTiro1( est_equipo.getTiro1() + valor );
                    }
                    break;
                case 5:
                    if ( m_pve == -1 ) {
                        est_jugador.setPto1  ( est_jugador.getPto1()  + valor );
                        est_j_equipo.setPto1 ( est_j_equipo.getPto1() + valor );
                        est_j_partido.setPto1( valor );
                        if ( est_jugador.getTiro1() ==0 )
                            est_jugador.setPorc1(0);
                        else
                            est_jugador.setPorc1( (float)est_jugador.getPto1() / (float)est_jugador.getTiro1() * (float)100.0 );

                        if ( est_j_equipo.getTiro1() ==0 )
                            est_j_equipo.setPorc1(0);
                        else
                            est_j_equipo.setPorc1( (float)est_j_equipo.getPto1() / (float)est_j_equipo.getTiro1() * (float)100.0 );

                        est_equipo.setPto1( est_equipo.getPto1() + valor );
                    }
                    break;
                case 6:
                    if ( m_pve == -1 ) {
                        est_jugador.setTiro2   ( est_jugador.getTiro2() + valor );
                        est_j_equipo.setTiro2  ( est_j_equipo.getTiro2() + valor );
                        est_j_partido.setTiro2( valor );
                        est_equipo.setTiro2( est_equipo.getTiro2() + valor );
                    }
                    break;
                case 7:
                    if ( m_pve == -1 ) {
                        est_jugador.setPto2  ( est_jugador.getPto2() + valor );
                        est_j_equipo.setPto2  ( est_j_equipo.getPto2() + valor );
                        est_j_partido.setPto2( valor );
                        if ( est_jugador.getTiro2() ==0 )
                            est_jugador.setPorc2(0);
                        else
                            est_jugador.setPorc2( (float)est_jugador.getPto2() / (float)est_jugador.getTiro2() * (float)100.0 );
                        if ( est_j_equipo.getTiro2() ==0 )
                            est_j_equipo.setPorc2(0);
                        else
                            est_j_equipo.setPorc2( (float)est_j_equipo.getPto2() / (float)est_j_equipo.getTiro2() * (float)100.0 );
                        est_equipo.setPto2( est_equipo.getPto2() + valor );
                    }
                    break;
                case 8:
                    if ( m_pve == -1 ) {
                        est_jugador.setTiro3  ( est_jugador.getTiro3()  + valor );
                        est_j_equipo.setTiro3 ( est_j_equipo.getTiro3() + valor );
                        est_j_partido.setTiro3( valor );
                        est_equipo.setTiro3( est_equipo.getTiro3() + valor );
                    }
                    break;
                case 9:
                    if ( m_pve == -1 ) {
                        est_jugador.setPto3  ( est_jugador.getPto3()  + valor );
                        est_j_equipo.setPto3 ( est_j_equipo.getPto3() + valor );
                        est_j_partido.setPto3( valor );
                        if ( est_jugador.getTiro3() ==0 )
                            est_jugador.setPorc3(0);
                        else
                            est_jugador.setPorc3( (float)est_jugador.getPto3() / (float)est_jugador.getTiro3() * (float)100.0 );
                        if ( est_j_equipo.getTiro3() ==0 )
                            est_j_equipo.setPorc3(0);
                        else
                            est_j_equipo.setPorc3( (float)est_j_equipo.getPto3() / (float)est_j_equipo.getTiro3() * (float)100.0 );
                        est_equipo.setPto3( est_equipo.getPto3() + valor );
                    }
                    break;
                case 10:
                    if ( m_pve == -1 ) {
                        est_jugador.setRebotesAtaque  ( est_jugador.getRebotesAtaque()  + valor );
                        est_j_equipo.setRebotesAtaque ( est_j_equipo.getRebotesAtaque() + valor );
                        est_j_partido.setRebotesAtaque( valor );
                        est_equipo.setRebotesAtaque( est_equipo.getRebotesAtaque() + valor );
                    }
                    break;
                case 11:
                    if ( m_pve == -1 ) {
                        est_jugador.setRebotesDefensa  ( est_jugador.getRebotesDefensa()  + valor );
                        est_j_equipo.setRebotesDefensa ( est_j_equipo.getRebotesDefensa() + valor );
                        est_j_partido.setRebotesDefensa( valor );
                        est_equipo.setRebotesDefensa( est_equipo.getRebotesDefensa() + valor );
                    }
                    break;
                case 12:
                    if ( m_pve == -1 ) {                    
                        est_jugador.setAsistencias  ( est_jugador.getAsistencias()  + valor );
                        est_j_equipo.setAsistencias ( est_j_equipo.getAsistencias() + valor );
                        est_j_partido.setAsistencias( valor );
                        est_equipo.setAsistencias( est_equipo.getAsistencias() + valor );
                    }
                    break;
                case 13:
                    if ( m_pve == -1 ) {
                        est_jugador.setRobos  ( est_jugador.getRobos()  + valor );
                        est_j_equipo.setRobos ( est_j_equipo.getRobos() + valor );
                        est_j_partido.setRobos( valor );
                        est_equipo.setRobos( est_equipo.getRobos() + valor );
                    }
                    break;
                case 14:
                    if ( m_pve == -1 ) {
                        est_jugador.setPerdidas  ( est_jugador.getPerdidas()  + valor );
                        est_j_equipo.setPerdidas ( est_j_equipo.getPerdidas() + valor );
                        est_j_partido.setPerdidas( valor );
                        est_equipo.setPerdidas( est_equipo.getPerdidas() + valor );
                    }
                    break;
                case 15:
                    if ( m_pve == -1 ) {
                        est_jugador.setTapones  ( est_jugador.getTapones()  + valor );
                        est_j_equipo.setTapones ( est_j_equipo.getTapones() + valor );
                        est_j_partido.setTapones( valor );
                        est_equipo.setTapones( est_equipo.getTapones() + valor );
                    }
                    break;
                case 16:
                    if ( m_pve == -1 ) {
                        est_jugador.setTaponesContra  ( est_jugador.getTaponesContra() + valor );
                        est_j_equipo.setTaponesContra ( est_j_equipo.getTaponesContra() + valor );
                        est_j_partido.setTaponesContra( valor );
                        est_equipo.setTaponesContra( est_equipo.getTaponesContra() + valor );
                    }
                    break;
                case 17:
                    if ( m_pve == -1 ) {                    
                        est_jugador.setFaltas  ( est_jugador.getFaltas()  + valor );
                        est_j_equipo.setFaltas ( est_j_equipo.getFaltas() + valor );
                        est_j_partido.setFaltas( valor );
                        est_equipo.setFaltas( est_equipo.getFaltas() + valor );
                    }
                    break;
                case 18:
                    if ( m_pve == -1 ) {
                        est_jugador.setFaltasContra  ( est_jugador.getFaltasContra()  + valor );
                        est_j_equipo.setFaltasContra ( est_j_equipo.getFaltasContra() + valor );
                        est_j_partido.setFaltasContra( valor );
                        est_equipo.setFaltasContra( est_equipo.getFaltasContra() + valor );
                    }
                    break;
                case 19:
                    if ( m_pve == -1 ) {
                        est_jugador.setValoracion   ( est_jugador.getValoracion()  + valor );
                        est_j_equipo.setValoracion  ( est_j_equipo.getValoracion() + valor );
                        est_j_partido.setValoracion ( valor );
                        if ( est_jugador.getPartidos() != 0 )
                            est_jugador.setValMedia   ( (float)est_jugador.getValoracion() / (float)est_jugador.getPartidos() );
                        est_equipo.setValoracion(  est_equipo.getValoracion() + valor);
                    }
                    break;
                case 20:
                    if ( m_maximo_hoy == false ) {

                        est_j_partido.setExperiencia( valor );
                        est_j_equipo.setExperiencia ( est_j_equipo.getExperiencia()+ valor );

                        DatosEquipo de = new DatosEquipo();
                        de.aumentaExpJugador ( em, multi, valor);
                    }
                    if ( m_pve == -1)
                        em.persist(multi.jugador);
                    break;
                default:
                    log.error("[ERROR]: Demasiados Campos"+ i );
                    break;
            }
        }
    } catch (Exception e) {
        log.error("[ERROR]: setJugador", e );
    }
        return multi;
    }

    public void finPartido ( ) {

        if ( m_pve != -1)
            return;

        /* Acumulamos las estadísticas sobre el equipo */
        AcumulaPartidoEquipo ( m_est_partido_c, m_est_e_partido_c );
        AcumulaPartidoEquipo ( m_est_partido_v, m_est_e_partido_v );

        em.persist(m_est_partido_c);
        em.persist(m_est_partido_v);

        /* Guardamos las estadísticas de partido en postgres y Mongo*/
        em.persist(m_est_e_partido_c);
        em.persist(m_est_e_partido_v);
        if ( mongo ) {
            try {
                MongoBasket m = new MongoBasket ();
                m.conectar();

                /* Mapeamos las clases a Morphia, este realizará una introspección,
                 * esto debería llevarse a un lugar donde no se haga más que una vez.
                 *
                 * Para no hacerlo clase por clase se puede forzar a que haga la operación
                 * de un paquete completo: morphia.mapPackage( "com.bitoon.basketdudes.mongo" );
                 */
                Morphia morphia = new Morphia();
                morphia.map(MonEstEquipoPartido.class).map(MonEstEquipoPartidoPK.class);

                DBObject mongo_est_e_partido_c = morphia.toDBObject(m_est_e_partido_c);
log.error( "JPA" + m_est_e_partido_c.toString() );
log.error( "MONGO" + mongo_est_e_partido_c.toString() );
                Datastore ds = morphia.createDatastore(m.getMongo(),"mydb");
log.error( "MONGO 2" );
                ds.save(mongo_est_e_partido_c);
log.error( "MONGO 3" );
            } catch( Exception e) {
                log.error("[ERROR][MONGO]: " , e);
            }
        }
    }

    private void AcumulaPartidoEquipo ( EstEquipo p_equipo, EstEquipoPartido p_e_partido ) {

        p_equipo.setTiro1	  ( p_equipo.getTiro1	      ()+ p_e_partido.getTiro1	       ());
        p_equipo.setTiro2	  ( p_equipo.getTiro2	      ()+ p_e_partido.getTiro2	       ());
        p_equipo.setTiro3	  ( p_equipo.getTiro3	      ()+ p_e_partido.getTiro3	       ());
        p_equipo.setPto1	  ( p_equipo.getPto1	      ()+ p_e_partido.getPto1	       ());
        p_equipo.setPto2	  ( p_equipo.getPto2	      ()+ p_e_partido.getPto2	       ());
        p_equipo.setPto3	  ( p_equipo.getPto3	      ()+ p_e_partido.getPto3	       ());
        p_equipo.setRebotesAtaque ( p_equipo.getRebotesAtaque ()+ p_e_partido.getRebotesAtaque ());
        p_equipo.setRebotesDefensa( p_equipo.getRebotesDefensa()+ p_e_partido.getRebotesDefensa());
        p_equipo.setAsistencias	  ( p_equipo.getAsistencias   ()+ p_e_partido.getAsistencias   ());
        p_equipo.setRobos	  ( p_equipo.getRobos	      ()+ p_e_partido.getRobos	       ());
        p_equipo.setPerdidas	  ( p_equipo.getPerdidas      ()+ p_e_partido.getPerdidas      ());
        p_equipo.setTapones	  ( p_equipo.getTapones	      ()+ p_e_partido.getTapones       ());
        p_equipo.setTaponesContra ( p_equipo.getTaponesContra ()+ p_e_partido.getTaponesContra ());
        p_equipo.setFaltas	  ( p_equipo.getFaltas	      ()+ p_e_partido.getFaltas	       ());
        p_equipo.setFaltasContra  ( p_equipo.getFaltasContra  ()+ p_e_partido.getFaltasContra  ());
        p_equipo.setValoracion    ( p_equipo.getValoracion    ()+ p_e_partido.getValoracion    ());

        if ( p_equipo.getTiro1() == 0)
            p_equipo.setTiro1(0);
        else
            p_equipo.setPorc1( (float)p_equipo.getPto1() / (float)p_equipo.getTiro1() * (float)100.0 );

        if ( p_equipo.getTiro2() == 0)
            p_equipo.setTiro2(0);
        else
            p_equipo.setPorc2( (float)p_equipo.getPto2() / (float)p_equipo.getTiro2() * (float)100.0 );

        if ( p_equipo.getTiro3() == 0)
            p_equipo.setTiro3(0);
        else
            p_equipo.setPorc3( (float)p_equipo.getPto3() / (float)p_equipo.getTiro3() * (float)100.0 );

        if ( p_equipo.getPartidos() == 0)
            p_equipo.setValMedia(0);
        else
            p_equipo.setValMedia( (float)p_equipo.getValoracion() / (float)p_equipo.getPartidos() );
    }

}
